import { defineStore } from 'pinia'
import { createStorage } from '@/utils/Storage'
import { store } from '@/store'
import { ACCESS_TOKEN, CURRENT_USER, IS_LOCKSCREEN } from '@/store/mutation-types'
import { ResultEnum } from '@/enums/httpEnum'

const Storage = createStorage({ storage: localStorage })
import { getUserInfo, login } from '@/api/system/user'
import { storage } from '@/utils/Storage'

interface UserState {
    token: string
    username: string
    welcome: string
    avatar: string
    roles: any[]
    info: any
}

export const useUserStore = defineStore({
    id: 'app-user',
    state: (): UserState => ({
        token: Storage.get(ACCESS_TOKEN, ''),
        username: '',
        welcome: '',
        avatar: '',
        roles: [],
        info: Storage.get(CURRENT_USER, {})
    }),
    getters: {
        getToken(): string {
            return this.token
        },
        getAvatar(): string {
            return this.avatar
        },
        getNickname(): string {
            return this.username
        },
        getRoles(): [any][] {
            return this.roles
        },
        getUserInfo(): object {
            return this.info
        }
    },
    actions: {
        setToken(token: string) {
            this.token = token
        },
        setAvatar(avatar: string) {
            this.avatar = avatar
        },
        setRoles(roles) {
            this.roles = roles
        },
        setUserInfo(info) {
            this.info = info
        },
        // 登录
        async login(userInfo) {
            try {
                const response = await login(userInfo)
                const { result, code, message } = response
                if (code === ResultEnum.SUCCESS) {
                    const ex = 7 * 24 * 60 * 60 * 1000
                    storage.set(ACCESS_TOKEN, result.token, ex)
                    storage.set(CURRENT_USER, result, ex)
                    storage.set(IS_LOCKSCREEN, false)
                    this.setToken(result.token)
                    this.setUserInfo(result)
                }
                return Promise.resolve(response)
            } catch (e) {
                return Promise.reject(e)
            }
        },

        // 获取用户信息
        GetInfo() {
            let that = this;
            return new Promise((resolve, reject) => {
                getUserInfo().then((res) => {
                    const result = res
                    if (result.roles && result.roles.length) {
                        const roles = result.roles
                        that.setRoles(roles)
                        that.setUserInfo(result)
                    } else {
                        reject(new Error('getInfo: roles must be a non-null array !'))
                    }
                    that.setAvatar(result.avatar)
                    resolve(res)
                })
                    .catch((error) => {
                        reject(error)
                    })
            })
        },

        // 登出
        async logout() {
            this.setRoles([])
            this.setUserInfo('')
            storage.remove(ACCESS_TOKEN)
            storage.remove(CURRENT_USER)
            return Promise.resolve('')
        }
    }
})

// Need to be used outside the setup
export function useUserStoreWidthOut() {
    return useUserStore(store);
}
